package com.zw.a.basic.a14.demo09_tcp_exercise;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

//案例: 客户端给服务器端上传文件, 并接收服务器端的回执信息.
//自定义的服务器端, 用来接收客户端传过来的数据, 并将其写入到目的地文件中, 然后给客户端一个回执信息"上传成功"
public class ServerDemo {
    public static void main(String[] args) throws IOException {
        //1. 创建服务器端的Socket对象.
        ServerSocket server = new ServerSocket(12345);
        //2. 监听客户端连接.
        System.out.println("server: " + 1);
        Socket accept = server.accept();
        System.out.println("server: " + 2);
        //3. 创建字符高效流, 封装目的地文件.
        BufferedWriter bw = new BufferedWriter(new FileWriter("day14/data/2.txt"));
        //4. 通过Socket#getInputStream()获取输入流, 可以读取客户端写过来的数据,
        //为了写入方便, 将其封装成: 字符高效流.
        BufferedReader br = new BufferedReader(new InputStreamReader(accept.getInputStream()));
        //5. 定义变量, 记录读取到的数据.
        String line;
        //6. 循环读取, 只要条件满足, 就一直读, 并将读取到的内容赋值给变量line
        while ((line = br.readLine()) != null) {   //循环没有结束, 因为没有接收到客户端写过来的 null
            //7. 将读取到的内容写到目的地文件中.
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        System.out.println("server: " + 3);

        //8. 获取输出流, 可以往客户端写数据.
        BufferedWriter bw2 = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
        //9. 给客户端返回一个回执信息"上传成功"
        bw2.write("文件上传成功");
        bw2.newLine();      //细节1: 必须写换行符, 因为等会儿在客户端我们是通过 readLine()来读取一行数据的, 它的结束标记就是 换行符
        bw2.flush();        //细节2: 必须写, 不然数据还在缓冲区, 客户端收不到.

        //10. 释放资源.
        bw.close();
        accept.close();
    }
}
